www.gusucode.com > 粒子群算法 matlab求解源码及结果 > 粒子群算法 matlab求解源码及结果/粒子群算法 matlab求解源码及结果/粒子群算法源代码/SecVibratPSO.m

    function [xm,fv] = SecVibratPSO(fitness,N,w,c1,c2,M,D)

format long;

%------初始化种群的个体------------

for i=1:N

    for j=1:D

        x(i,j)=randn;  %随机初始化位置
        
        xl(i,j)=randn;

        v(i,j)=randn;  %随机初始化速度

    end

end

%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------

for i=1:N

    p(i)=fitness(x(i,:));

    y(i,:)=x(i,:);

end

pg = x(N,:);             %Pg为全局最优

for i=1:(N-1)

    if fitness(x(i,:))<fitness(pg)

        pg=x(i,:);

    end

end

%------进入主要循环,按照公式依次迭代------------

for t=1:M

    for i=1:N
        phi1 = c1*rand();
        phi2 = c2*rand();
        if t < M/2  
            ks1 = (2*sqrt(phi1)-1)*rand()/phi1;
            ks2 = (2*sqrt(phi2)-1)*rand()/phi2;
        else
            ks1 = (2*sqrt(phi1)-1)*(1 + rand())/phi1;
            ks2 = (2*sqrt(phi2)-1)*(1 + rand())/phi2;
        end
            
        v(i,:)=w*v(i,:)+phi1*(y(i,:)-(1+ks1)*x(i,:)+ks1*xl(i,:))+ ...
                 phi2*(pg-(1+ks2)*x(i,:)+ks1*xl(i,:));
        
        xl(i,:) = x(i,:);

        x(i,:)=x(i,:)+v(i,:);

        if fitness(x(i,:))<p(i)

            p(i)=fitness(x(i,:));

            y(i,:)=x(i,:);

        end

        if p(i)<fitness(pg)

            pg=y(i,:);

        end

    end
 
    Pbest(t)=fitness(pg);
    
end
xm = pg';
fv = fitness(pg);